1 module hunt.cache.manger;
2 import hunt.cache.ucache;
3 
4 class CacheManger
5 {
6 	UCache createCache( string cacheName ,  string driverName = "memory"  ,string args = "" , bool enableL2Cache = false)
7 	{
8 		synchronized(this)
9 		{
10 			if(getCache(cacheName)){
11 				return null;
12 			}
13 
14 			auto ucache  = UCache.CreateUCache(driverName , args , enableL2Cache);
15 			_mapCaches[cacheName] = ucache;
16 			return ucache;
17 		}
18 	}
19 
20 	string[] getAllCacheNames()
21 	{
22 		synchronized(this){
23 			return _mapCaches.keys;
24 		}
25 	}
26 
27 	UCache getCache(string cacheName)
28 	{
29 		synchronized(this){
30 			UCache *ucache = cacheName in _mapCaches;
31 			if(ucache == null)
32 				return null;
33 			else
34 				return *ucache;
35 		}
36 	}
37 
38 	void destroyCache(string cacheName)
39 	{
40 		synchronized(this){
41 			_mapCaches.remove(cacheName);
42 		}
43 	}
44 
45 private:
46 	UCache[string]			_mapCaches;
47 }
48 
49 
50 unittest{
51 
52 	import core.thread;
53 	import std.algorithm;
54 	import std.stdio;
55 
56 
57 	CacheManger manger = new CacheManger();
58 
59 	//test manger.
60 	string[] allkeys = ["memory" , "memory_l2"];
61 
62 	auto memory = manger.createCache(allkeys[0]);
63 	auto memory_l2 = manger.createCache(allkeys[1] , "memory" , "" , true);
64 
65 	version(SUPPORT_REDIS)
66 	{
67 		allkeys ~= ["redis" ,"redis_l2"];
68 
69 		auto redis = manger.createCache(allkeys[$ - 2] , "redis" , "127.0.0.1:6379");
70 		auto redis_l2 = manger.createCache(allkeys[$ - 1] , "redis" , "127.0.0.1:6379" , true);
71 	}
72 
73 	version(SUPPORT_MEMCACHED)
74 	{
75 		allkeys ~= ["memcached" , "memcached_l2"];
76 		auto memcached = manger.createCache(allkeys[$ - 2] , "memcached" , "--SERVER=127.0.0.1:11211" );
77 		auto memcached_l2 = manger.createCache(allkeys[$ -1] , "memcached" , "--SERVER=127.0.0.1:11211" , true);
78 	}
79 
80 	version(SUPPORT_ROCKSDB)
81 	{
82 		allkeys ~= ["rocksdb" , "rocksdb_l2"];
83 		auto rocksdb = manger.createCache(allkeys[$ - 2] , "rocksdb" , "/tmp/test1");
84 		auto rocksdb_l2 = manger.createCache(allkeys[$ -1] , "rocksdb" , "/tmp/test2" , true);
85 	}
86 
87 
88 	auto names = manger.getAllCacheNames();
89 	names.sort;
90 	allkeys.sort;
91 	assert(allkeys.length == names.length);
92 
93 	void  test(UCache cache)
94 	{
95 		cache.put("key1" ,"value1" , 1);
96 		string[string] map = ["key2":"value2" , "key3":"value3"];
97 		cache.putAll(map);
98 
99 		string value = cache.get("key1");
100 		assert(value == "value1");
101 		assert(cache.containsKey("key2"));
102 		assert(!cache.putifAbsent("key1" , "value11"));
103 		auto kvs = cache.getall(["key2" , "key3"]);
104 		foreach(k,v ; kvs)
105 		{
106 			assert(map[k] == v.origin);
107 		}
108 		
109 		assert(cache.remove("key2"));
110 		assert(!cache.containsKey("key2"));
111 		Thread.sleep(dur!"seconds"(2));
112 		assert(!cache.containsKey("key1"));
113 		assert(cache.putifAbsent("key1" , "value11"));
114 		cache.clear();
115 		assert(!cache.containsKey("key3"));
116 	}
117 
118 	foreach(k ; allkeys)
119 	{
120 		import std.stdio;
121 		writeln("test " ,k);
122 
123 		test(manger.getCache(k));
124 	}
125 
126 	foreach(k ; allkeys)
127 		manger.destroyCache(k);
128 
129 	assert(manger.getAllCacheNames().length == 0);
130 
131 }